class Solution {
    public int subarraySum(int[] nums, int k) {
        /**
        初始化一个空的哈希表和pre_sum=0的前缀和变量
        设置返回值ret = 0，用于记录满足题意的子数组数量
        循环数组的过程中，通过原地修改数组的方式，计算数组的累加和
        将当前累加和减去整数K的结果，在哈希表中查找是否存在
        如果存在该key值，证明以数组某一点为起点到当前位置满足题意，ret加等于将该key值对应的value
        判断当前的累加和是否在哈希表中，若存在value+1，若不存在value=1
        最终返回ret即可
        但在这里要注意刚才说到的前缀和边界问题。 我们在计算这种场景时，需要考虑如果以数组nums[0]为开头的连续子数组就满足题意呢？ 此时候我们的哈希表还是空的，没办法计算前缀和！所以遇到这类题目，都需要在哈希表中默认插入一个{0:1}的键值对， 用于解决从数组开头的连续子数组满足题意的特殊场景。
         */
         /**
         num[1,3,2,4,1,1,-2]  k = 6
         ()   前缀  前缀-k
         (1)  1     -5    
         (2)  4     -2
         (3)  6     0      以(3)为终点，(1)为起点目标为0，前三个为一个结果
         (4)  10    4      以(4)为终点，(1)为起点目标为4，在前缀中有4，减去，(3)(4)是一个结果
         (5)  11    5
         (6)  12    6       (4)(5)(6)是一个结果
          */
        int sum = 0;
        int ret = 0;
        HashMap<Integer,Integer> map = new HashMap<>();
        map.put(0,1);
        for(int i : nums) {
            sum += i;
            //(1)getOrDefault(key, default)如果存在key, 则返回其对应的value, 否则返回给定的默认值
            //(2)key值相同, value值+1或者-1
            ret += map.getOrDefault(sum - k,0);
            //map.put(s1.charAt(i), map.getOrDefault(s1.charAt(i), 0) + 1); 若没有s1中的字符就是0, 若有s1中的字符就是在原有值上+1
            map.put(sum,map.getOrDefault(sum,0) + 1);//放进该元素，若没有，为0，若有+1,
        }
        return ret;
    }
}